package MyApp::Controller::Login; # Login模块打包 注意路径和包含关系
use Mojo::Base 'Mojolicious::Controller';

sub index { # index 子程序 访问首页时调用 此时还未绑定
  my $c = shift;
  my $user = $c->param('user') || ''; # 获取user参数，没有就取空
  my $pass = $c->param('pass') || ''; # 获取pass参数 没有就取空
  # 返回 index页面渲染 这是缩写 ，写全为 $c->render('index')
  # 因为默认模板文件放在./templates下所以这里不用写全路径
  # 注意这里renturn还有个unless条件(是if的反义词)
  # $c->users 这个在MyApp.pm里已经定义了
  # $c->helper(users => sub { state $users = MyUsers->new }); # 用助手方法绑定MyUsers实例到c->users
  # MyApp::Model::Users(别名MyUsers) 就是Users.pm
  # 所以调用Users的check方法验证上面从$c取到的$user和$pass是否和Users类里的数据匹配，如果不匹配
  # 返回index页面这里return相当于一个break跳出了余下的代码块
  return $c->render unless $c->users->check($user, $pass);
  # 当unless 成立的时候 就运行以下代码
  # 先把$user的值 写入session 的user键里
  $c->session(user => $user);
  # 然后给之后的网页存储一个返回值，下个页面将在刷新后看到
  $c->flash(message => 'Thanks for logging in.');
  # 跳转到'被保护'页面
  $c->redirect_to('protected');
}

# 检测是否登录的方法
sub logged_in {
  my $c = shift;
  # 如果找到session{'user'}的值，也就是user已登录，返回1，真
  return 1 if $c->session('user');
  # 这里相当于if else 执行的语句了
  # 跳转到'index'
  $c->redirect_to('index');
  # 并返回undef
  return undef;
}

# 登出操作
sub logout {
  my $c = shift;
  # session的过期设置为1，立即过期
  $c->session(expires => 1);
  # 跳转到index
  $c->redirect_to('index');
}
# 返回1
1;
